const path = require("path");
const koa = require("koa");
const cors = require("koa2-cors");
const bodyParser = require("koa-bodyparser");
const koaStatic = require("koa-static");
const errorHandler = require("./error-handle");
const useRoutes = require("../router");
const routerResponse = require("../middleware/routerResponse.middleware");
const parameter = require("koa-parameter");
const { accessLogger } = require("../../logger");
const { logger } = require("../../logger");
const koaBody = require("koa-body");

const app = new koa();
app.useRoutes = useRoutes;

// 使用中间件处理404
app.use(async (ctx, next) => {
  // 调用next执行下一个中间件
  await next();
  if (ctx.status === 404) {
    ctx.response.type = "html";
    ctx.body = "404";
  }
});

// 在try-catch错误是无法监听的
// 需要手动释放：ctx.app.emit('error', err, ctx)
// 或者在try-catch中直接logger.error(e)
// 在需要的代码中放入即可监听
app.on("error", (err, ctx) => {
  logger.error(err);
  // 这里可以优化下，开发环境才记录日志
  if (process.env.NODE_ENV !== "development") {
    logger.error(err);
  }
});

app.use(
  koaBody({
    mmultipart: true,
    formLimit: 2000 * 1024 * 1024,
    formidable: {
      uploadDir: __dirname + "/temps",
    },
  })
);

// 静态资源管理，存放图片文件路径
app.use(koaStatic(path.join(__dirname, "../../uploads/picture/")));
// 访问级别的，记录用户的所有请求，作为koa的中间件，直接使用便可。
app.use(accessLogger());
// 跨域
app.use(cors());
// 使用这个解析json数据
app.use(bodyParser());
// 校验参数
app.use(parameter(app));
// 统一接口成功或失败返回格式
app.use(routerResponse());
// 错误处理
app.on("error", errorHandler); //这个on又是啥？
// 统一注册路由
app.useRoutes();

module.exports = app;
